////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

// Το singleton "Pexnidi" χρησιμοποιείται ως namespace.

Pexnidi = {};

// Το singleton "minima" περιέχει διάφορα μηνύματα που δεν μπορούν να είναι
// hard coded.

Pexnidi.minima = {
	alagi: 'Παρακαλώ, αλλάξτε <span class="entono">δύο</span> φύλλα και δηλώστε την αγορά σας…',
	epilogi: 'Επιλέξτε την αγορά σας. Οι συμπαίκτες σας περιμένουν…',
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

// Όλα τα panel τού παιχνιδιού εμφανίζονται σε div με id "PXpanel", το οποίο
// είναι μια ορθογώνια περιοχή που εκκινεί περίπου στο κάτω αριστερό άκρο του
// γηπέδου, δηλαδή της διαθέσιμης περιοχής της τσόχας πάνω από τα φύλλα του
// νότου, όμως το κάθε panel μπορεί να έχει τα δικά του CSS χαρακτηριστικά,
// μέσω της αντίστοιχης κλάσης, π.χ. "panelDilosi", "panelTzogos" κλπ.
// Μόνο ένα panel μπορεί να υφίσταται σε κάθε χρονική στιγμή, επομένως κάθε
// φορά που ετοιμάζουμε ένα νέο panel, μπορούμε με ασφάλεια να διαγράψουμε
// τυχόν υπάρχον panel.

Trapezi.pexnidiPanel = function(klasi) {
	var panel;

	$('#PXpanel').remove();
	panel = $('<div>').attr({id:'PXpanel'});
	if (klasi) panel.addClass(klasi);
	return panel.anadisi();
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

// Η μέθοδος "panelDilosi" εμφανίζει το πάνελ των υποψηφίων δηλώσεων αγοράς κατά τη
// φάση της πλειοδοσίας τής αγοράς.

Trapezi.prototype.panelDilosi = function(protasi) {
	var panel, epomeni;

	// Προετοιμάζουμε το panel ως DOM element.

	panel = Trapezi.pexnidiPanel('panelDilosi');

	// Έχουμε βρει τη δήλωση που πρέπει να προταθεί πρώτη στον παίκτη και
	// την εισάγουμε στο panel.

	panel.append(protasi.dilosiButton());

	// Αν η δήλωση που μόλις εισήχθη στο panel είναι "ΑΜΑ ΜΕΙΝΟΥΝ", τότε θα
	// πρέπει να ακολουθήσει δήλωση "ΠΡΩΤΑ".

	if (protasi.isGrafio()) panel.append((new Dilosi()).setProta().dilosiButton());

	// Τελευταία στη σειρά των δηλώσεων παρέχεται, φυσικά, η δήλωση "ΠΑΣΟ".

	panel.append(new Dilosi({paso: 1}).dilosiButton());

	$('#tsoxa').append(panel);
	return this;
}

// Η μέθοδος "dilosiButton" επιστρέφει jQuery DOM element για το κουμπί επιλογής
// τής ανά χείρας δηλώσεως.

Dilosi.prototype.dilosiButton = function() {
	var button, lektiko, dilosi = this;

	button = $('<div>').addClass('dialogosButton dilosiButton selectOff').on('click', function(e) {
		var panel = $('#PXpanel');

		Prefadoros.input.apiko(e);

		// Πρέπει να αποφύγουμε την περίπτωση του double click, ή γενικά
		// την περίπτωση να αποσταλούν περισσότερες από μια δηλώσεις.

		if (panel.data('anenergo')) return;
		panel.data('anenergo', true);
		panel.css({opacity: 0.5});

		Client.node('energiaDilosi', dilosi.apostoli(), function(rsp) {
			if (!rsp) return;

			Client.fyi.spano(rsp);
			panel.data('anenergo', false);
			panel.css({opacity: 1});
		});
	});

	if (this.paso) return button.text('ΠΑΣΟ');

	if (this.grafio) return button.text(globals.random() % 3 ? 'Άμα μείνουν' : 'Τα γράφω');

	// Στην περίπτωση των απλών αγορών, και δύο στις τρεις φορές, παίζουμε
	// με τις λέξεις "ΠΡΩΤΑ", "ΜΠΑΣΤΟΥΝΙΑ", "ΔΕΥΤΕΡΑ" κλπ.

	if ((this.bazes < 7) && (globals.random() % 3)) {
		lektiko = this.edo ? 'Έχω ' : '';
		switch (this.xroma) {
		case 'S': return button.text(lektiko + (globals.random() % 2 ? 'ΠΡΩΤΑ' : 'ΜΠΑΣΤΟΥΝΙΑ'));
		case 'C': return button.text(lektiko + (globals.random() % 2 ? 'ΔΕΥΤΕΡΑ' : 'ΣΠΑΘΙΑ'));
		case 'D': return button.text(lektiko + (globals.random() % 2 ? 'ΚΑΡΑ' : 'ΤΡΙΤΑ'));
		case 'H': return button.text(lektiko + (globals.random() % 2 ? 'ΚΟΥΠΕΣ' : 'ΤΕΤΑΡΤΑ'));
		case 'N': return button.text(lektiko + (globals.random() % 2 ? 'ΑΧΡΟΑ' : 'ΑΧΡΩΜΑΤΙΣΤΑ'));
		default: globals.fatal(this.xroma + ': απροσδιόριστο χρώμα αγοράς');
		}
	}
		
	return button.append(this.lektikoDOM());
}

// Η μέθοδος "apostoli" επιστρέφει τις παραμέτρους τής ανά χείρας δηλώσεως
// ως GET URL παραμέτρους προκειμένου να αποσταλούν στον Node server.

Dilosi.prototype.apostoli = function() {
	var params;

	// Το πρόγραμμα παραλαβής και διαχείρισης ενεργειών απαιτεί και το
	// τραπέζι του ενεργούντος παίκτη.

	if (Prefadoros.ego.oxiTrapezi()) globals.fatal('ακαθόριστο τραπέζι');
	params = 'trapezi=' + Prefadoros.ego.trapezi.kodikos;

	// Αν πρόκειται για δήλωση "ΠΑΣΟ" αποστέλλεται η παράμετρος "paso".

	if (this.isPaso()) return params + '&paso';

	// Για δηλώσεις "ΑΜΑ ΜΕΙΝΟΥΝ" αποστέλλεται η παράμετρος "grafio".

	if (this.isGrafio()) return params + '&grafio';

	// Για τις υπόλοιπες δηλώσεις αποστέλλεται το χρώμα με την παράμετρο
	// "xroma" και οι μπάζες με την παράμετρο "bazes".

	if (!Agora.xroma.hasOwnProperty(this.xroma)) globals.fatal(this.xroma + ': λάθος χρώμα δήλωσης');
	if (!Agora.bazes.hasOwnProperty(this.bazes)) globals.fatal(this.bazes + ': λάθος μπάζες δήλωσης');
	params += '&xroma=' + this.xroma + '&bazes=' + this.bazes;

	// Αν πρόκειτιαι για δήλωση παραμονής στην προηγούμενη δήλωση, τότε
	// αποστέλλεται και παράμετρος "edo".

	if (this.isEdo()) params += '&edo';

	return params;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

// Η μέθοδος "tzogosEmfanisi" εμφανίζει το πάνελ του τζόγου κατά το flop.
// Ο τζόγος πρέπει να υφίσταται ως χαρτωσιά δύο φύλλων στο τραπέζι τη
// στιγμή του flop, καθώς μεταφέρεται ως πρόσθετη πληροφορία με την
// τελευταία δήλωση πριν από το flop.

Trapezi.prototype.tzogosEmfanisi = function() {
	var panel, i, asos, ixos;

	if (this.oxiTzogos()) return this;

	panel = Trapezi.pexnidiPanel('panelTzogos');
	asos = 0;
	for (i = 0; i < 2; i++) {
		$('<img>').addClass('filoTzogos filoTzogos' + i).attr({
			src: 'images/trapoula/' + this.tzogos.fila[i].xroma + this.tzogos.fila[i].axia + '.png',
		}).appendTo(panel);
		if (this.tzogos.fila[i].axia == 'A') asos++;
	}
	$('#tsoxa').append(panel);

	if (asos > 1) ixos = 'daiaiaing.ogg';
	else if (asos > 0) ixos = 'firoulit.ogg';
	else ixos = 'top.ogg';
	Client.sound.play(ixos);

	return this;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

// Η μέθοδος "panelAgoraDOM" διαμορφώνει το πάνελ επιλογής αγοράς. Το πάνελ περιλαμβάνει
// πλήκτρα που αντιστοιχούν σε όλες ις διαθέσιμες αγορές, πλήκτρο "ΣΟΛΟ" για αδιέξοδες
// αγορές, και πλήκτρο επιλογής των άσων όταν, φυσικά, συντρέχουν οι προϋποθέσεις.

Trapezi.prototype.panelAgoraDOM = function() {
	var trapezi = this, panel, i, j, grami;

	this.ekinisi = new Agora();
	if (this.agora.isGrafio()) {
		this.ekinisi.xroma = 'S';
		this.ekinisi.bazes = 6;
	}
	else {
		this.ekinisi.xroma = this.agora.xroma;
		this.ekinisi.bazes = this.agora.bazes;
	}

	panel = Trapezi.pexnidiPanel('panelAlagi');
	for (i = 6; i <= 10; i++) {
		grami = $('<div>');
		for (j = 0; j < Agora.amorx.length; j++) {
			(new Agora()).string2agora('N' + Agora.amorx[j] + Agora.bazes[i]).
			protasiAgoraDOM(this).appendTo(grami);
		}
		grami.appendTo(panel);
	}

	// Συνεχίζουμε με την πρόταση σόλο μέσα για την περίπτωση που
	// ο τζογαδόρος βρίσκεται σε αδιέξοδο.

	$('<img>').attr({
		src: 'images/misc/solo.png',
		title: 'Γράψτε σόλο μέσα την αγορά σας',
	}).addClass('protasiSolo').appendTo(panel).
	on('mouseenter', function(e) {
		e.stopPropagation();
		$(this).fadeTo(100, 1);
	}).
	on('mouseleave', function(e) {
		e.stopPropagation();
		$(this).fadeTo(100, 0.3);
	}).
	on('click', function(e) {
		Prefadoros.input.apiko(e);
		panel.find('#PXagora').remove();
		epiveveosi = $('<div>').attr({id: 'PXagora'}).addClass('dialogos').siromeno({
			top: '-170px',
			left: '110px',
			width: '340px',
		}).pineza().anadisi();
		epiveveosi.
		append($('<div>').attr({id: 'PXagoraSolo'}).addClass('lathos').
			html('Επιλέξατε να μπείτε σόλο στην αγορά:')).
		append($('<div>').attr({
			id: 'PXsoloCheck',
			title: 'Σόλο μέσα στα «' + trapezi.ekinisi.lektiko() + '»',
		}).append(trapezi.ekinisi.lektikoDOM())).
		append($('<div class="kentro">').
			append($('<div>').addClass('lathos entono').attr({
				title: 'Τελική υποβολή αιτήματος σόλο μέσα στα «' + trapezi.ekinisi.lektiko() + '»',
			}).dialogosButton('ΣΟΛΟ', function() {
				Client.fyi.pano('Υπεβλήθη αίτημα σολαρίας στα ' + trapezi.ekinisi.lektiko());
				Client.node('energiaSolo', 'trapezi=' + trapezi.kodikos,
					'agora=' + trapezi.ekinisi.agora2string(), function(rsp) {
					if (!rsp) return;

					Client.fyi.spano(rsp);
				});
			})).
			append($('<div>').dialogosButton('Ακύρωση'))
		).
		appendTo(panel);
		Client.sound.dialogos();
	});

	// Συνεχίζουμε με την πρόταση των τεσσάρων άσων εφόσον συντρέχουν,
	// βέβαια, οι απαραίτητες προϋποθέσεις.

	if (this.isAsoi() && this.fila[this.tzogadoros].isAsoi()) {
		panel.data('asoi', true).data('asoiDilosi', true);
		$('<img>').addClass('protasiAsoi').attr({
			src: 'images/cpanel/asoiOn.png',
			title: 'Έχετε τους άσους!',
		}).appendTo(panel).
		on('mouseenter', function(e) {
			e.stopPropagation();
			if (panel.data('emfanes')) return;
			$(this).fadeTo(100, 1);
		}).
		on('mouseleave', function(e) {
			e.stopPropagation();
			if (panel.data('emfanes')) return;
			$(this).fadeTo(100, 0.3);
		}).
		on('click', function(e) {
			Prefadoros.input.apiko(e);
			if (panel.data('asoiDilosi')) {
				panel.data('asoiDilosi', false);
				if (trapezi.agora) trapezi.agora.setAsoi(false);
				$(this).attr({
					src: 'images/cpanel/asoiOff.png',
					title: 'Έχετε τους άσους, αλλά δεν προτίθεστε να τους δηλώσετε',
				}).addClass('protasiAsoiOff');
				Client.sound.protasiAsoi(false);
			}
			else {
				panel.data('asoiDilosi', true);
				if (trapezi.agora) trapezi.agora.setAsoi(true);
				$(this).attr({
					src: 'images/cpanel/asoiOn.png',
					title: 'Έχετε τους άσους!',
				}).removeClass('protasiAsoiOff');
				Client.sound.protasiAsoi();
			}

			$('#PXagoraCheck').html(trapezi.agora.lektikoDOM()).attr({
				title: trapezi.agora.lektiko(),
			});
		});
	}

	panel.appendTo('#tsoxa');
	Prefadoros.tsoxa.fyi(Pexnidi.minima.alagi);
	return this;
}

// Η μέθοδος "protasiAgoraDOM" εμφανίζει πλήκτρο πρότασης της αγοράς
// και χρησιμοποιείται στην κατασκευή τού πάνελ επιλογής αγοράς.

Agora.prototype.protasiAgoraDOM = function(trapezi) {
	var
	ekinisi = trapezi.agora,
	agora = this,
	domel = $('<div>').addClass('dialogosButton protasiAgora');

	if (this.protasiAgoraMikroteri(ekinisi)) domel.addClass('protasiAgoraOff').
	on('mouseenter', function(e) {
		e.stopPropagation();
	});
	else domel.on('click', function(e) {
		Prefadoros.input.apiko(e);
		agora.ipovoli(trapezi);
	});

	domel.
	append($('<div>').addClass('protasiBazes').text(this.bazes)).
	append($('<img>').addClass('protasiXroma').attr({
		src: 'images/trapoula/xroma' + this.xroma + '.png',
	}));

	return domel;
}

Agora.prototype.protasiAgoraMikroteri = function(ekinisi) {
	if (ekinisi.isGrafio()) return false;
	if (this.bazes > ekinisi.bazes) return false;
	if (this.bazes < ekinisi.bazes) return true;
	return (Agora.xroma[this.xroma] < Agora.xroma[ekinisi.xroma]);
}

Agora.prototype.ipovoli = function(trapezi) {
	var panel, epiveveosi, panel, agora = this;
 
	panel = $('#PXpanel');
	this.asoi = this.setAsoi(panel.data('asoiDilosi'));

	panel.find('#PXagora').remove();
	epiveveosi = $('<div>').attr({id: 'PXagora'}).addClass('dialogos').siromeno({
		top: '-130px',
		left: '110px',
	}).pineza().anadisi();
	epiveveosi.
	append($('<div>').attr({
		id: 'PXagoraCheck',
		title: this.lektiko(),
	}).append(this.lektikoDOM())).
	append($('<div class="kentro">').
		append($('<div>').attr({
			title: 'Οριστική υποβολή αιτήματος αγοράς «' + this.lektiko() + '»',
		}).dialogosButton('Αγορά', function() {
			if (panel.data('ipovoli')) return;
			panel.data('ipovoli', true);
			trapezi.ipovoliAgoras(agora, panel);
		})).
		append($('<div>').dialogosButton('Ακύρωση'))
	).
	appendTo(panel);
	Client.sound.dialogos();
}

Trapezi.prototype.ipovoliAgoras = function(agora, panel) {
	var trapezi = this, params, filo, skarta = [];

	params = 'trapezi=' + Prefadoros.ego.trapezi.kodikos +
		'&xroma=' + agora.xroma + '&bazes=' + agora.bazes;
	if (agora.isAsoi()) params += '&asoi';
	params += '&skarta=';

	$('#tsoxaFila1').find('.filoPano').each(function() {
		filo = $(this).parent().data('filo');
		skarta.push(filo);
		params += filo.toString();
	});

	if (skarta.length != 2) {
		Client.fyi.spano('Πρέπει να επιλέξετε ΔΥΟ φύλλα για αλλαγή');
		return;
	}

	Client.fyi.pano('Κατετέθη αγορά «' + agora.lektiko() + '». Παρακαλώ περιμένετε…');
	Client.node('energiaAgora', params, function(rsp) {
		var i;

		Client.fyi.epano(rsp);
		if (rsp) {
			panel.data('ipovoli', false);
			return;
		}
	});
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

// Η μέθοδος "panelSimetoxi" εμφανίζει το πάνελ των υποψηφίων δηλώσεων συμμετοχής
// στον παίκτη που έχει σειρά να υποβάλει δήλωση συμμετοχής.

Trapezi.prototype.panelSimetoxi = function() {
	var
	panel,
	plist = this.protasiSimetoxis(),
	i,
	simetoxi;

	// Προετοιμάζουμε το panel ως DOM element.

	panel = Trapezi.pexnidiPanel('panelSimetoxi');

	for (i = 0; i < plist.length; i++) {
		simetoxi = (new Simetoxi({simetoxi: plist[i]}));
		panel.append(simetoxi.simetoxiButton());
	}

	$('#tsoxa').append(panel);
	return this;
}

// Η μέθοδος "protasiSimetoxis" επιστρέφει array δυνατών συμμετοχής οι οποίες
// θα εμφανιστούν ως πλήκτρα συμμετοχής.

Trapezi.prototype.protasiSimetoxis = function() {
	var pektis1, dilosi1, pektis2;

	// Αν δεν υπάρχει ακόμη δήλωση συμμετοχής από τον πρώτο παίκτη, δίνεται
	// μόνο η επιλογή "ΠΑΙΖΩ".

	pektis1 = this.tzogadoros.epomenosPektis();
	if (!this.simetoxi.hasOwnProperty(pektis1)) return ['ΠΑΙΖΩ', 'ΠΑΣΟ'];

	// Ο πρώτος παίκτης έχει κάνει δήλωση. Αν ο δεύτερος δεν έχει κάνει ακόμη
	// δήλωση συμμετοχής, τότε δίνεται η δυνατότητα "ΠΑΙΖΩ" και σε περίπτωση
	// που ο πρώτος παίκτης δήλωσε πάσο, δίνεται και η επιλογή "ΜΑΖΙ".

	dilosi1 = this.simetoxi[pektis1];
	pektis2 = pektis1.epomenosPektis();
	if (!this.simetoxi.hasOwnProperty(pektis2)) {
		if (dilosi1.isPaso()) return ['ΠΑΙΖΩ', 'ΜΑΖΙ', 'ΠΑΣΟ'];
		return ['ΠΑΙΖΩ', 'ΠΑΣΟ'];
	}

	// Και ο δεύτερος παίκτης έχει κάνει δήλωση συμμετοχής, επομένως δίνεται
	// εκ νέου δυνατότητα στον πρώτο παίκτη να πάρει μαζί τον δεύτερο παίκτη,
	// εφόσον ο δεύτερος παίκτης έχει δηλώσει "ΠΑΣΟ".

	if (this.simetoxi[pektis2].isPaso()) return ['ΜΑΖΙ', 'ΜΟΝΟΣ'];

	// Αν ο δεύτερος παίκτης δήλωσε "ΠΑΖΩ", τότε ο πρώτος παίκτης έχει τη
	// δυνατότητα να τον πάρει μαζί.

	return ['ΜΑΖΙ', 'ΠΑΣΟ'];
}

// Η μέθοδος "simetoxiButton" επιστρέφει jQuery DOM element για το κουμπί επιλογής
// τής ανά χείρας δηλώσεως συμμετοχής.

Simetoxi.prototype.simetoxiButton = function() {
	var simetoxi = this;

	return $('<div>').addClass('dialogosButton simetoxiButton selectOff').
		text(this.simetoxi).on('click', function(e) {
			var panel = $('#PXpanel');

			Prefadoros.input.apiko(e);

			// Πρέπει να αποφύγουμε την περίπτωση του double click, ή γενικά
			// την περίπτωση να αποσταλούν περισσότερες από μια δηλώσεις.

			if (panel.data('anenergo')) return;
			panel.data('anenergo', true);
			panel.css({opacity: 0.5});

			Client.node('energiaSimetoxi', simetoxi.apostoli(), function(rsp) {
				if (!rsp) return;

				Client.fyi.spano(rsp);
				panel.data('anenergo', false);
				panel.css({opacity: 1});
			});
		});
}

// Η μέθοδος "apostoli" επιστρέφει τις παραμέτρους τής ανά χείρας δηλώσεως συμμετοχής
// ως GET URL παραμέτρους προκειμένου να αποσταλούν στον Node server.

Simetoxi.prototype.apostoli = function() {
	if (Prefadoros.ego.oxiTrapezi()) globals.fatal('ακαθόριστο τραπέζι');
	return 'trapezi=' + Prefadoros.ego.trapezi.kodikos + '&simetoxi=' + this.simetoxi.uri();
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

Dilosi.prototype.lektikoDOM = function() {
	var domel = $('<div>');

	if (this.isPaso()) {
		domel.append('ΠΑΣΟ');
		if (this.isGrafio()) return domel;
		if (this.isProta()) return domel;
		domel.append(' ');
	}
	else if (this.isGrafio()) domel.append('Άμα μείνουν');
	else if (this.isEdo()) domel.append('Έχω ');
	domel.attr({
		title: this.lektiko(),
	});

	if (!Agora.xroma.hasOwnProperty(this.xroma)) return domel;
	if (!Agora.bazes.hasOwnProperty(this.bazes)) return domel;

	domel.
	append($('<div>').addClass('dilosiBazes').text(this.bazes)).
	append($('<img>').addClass('dilosiXroma').attr({
		src: 'images/trapoula/xroma' + this.xroma + '.png',
	}));

	return domel;
}

// Συνήθως η μέθοδος αγοράς "lektikoDOM" χρησιμοποιείται για το λεκτικό τής
// αγοράς στα πλήκτρα επιλογής αγοράς. Μετά την αγορά, όμως, η ίδια μέθοδος
// χρησιμοποιείται για το λεκτικό τής αγοράς στην περιοχή τού τζογαδόρου.
// Σ' αυτή την περίπτωση πρέπει να χρησιμοποιηθούν CSS κλάσεις μικροτέρου
// μεγέθους, οπότε περνάμε το πρώτο συνθετικό των κλάσεων αυτών ως παράμετρο.
// By default είναι "agora", ενώ μπορούμε να περάσουμε "dilosi" για μέγεθος
// βολικό στην περιοχή αγοράς τού τζογαδόρου. Οι κλάσεις που χρησιμοπούνται
// είναι "agoraXroma", "agoraBazes", "agoraAsoi", ενώ οι αντίστοιχες για την
// περιοχή αγοράς του τζογαδόρου είναι "dilosiXroma", "dilosiBazes" και
// "dilosiAsoi".

Agora.prototype.lektikoDOM = function(dilosi) {
	var domel = $('<div>');

	if (dilosi === undefined) dilosi = 'agora';
	domel.attr({
		title: this.lektiko(),
	}).
	append($('<div>').addClass(dilosi + 'Bazes').text(this.bazes)).
	append($('<img>').addClass(dilosi + 'Xroma').attr({
		src: 'images/trapoula/xroma' + this.xroma + '.png',
	}));

	if (this.isAsoi()) {
		domel.
		append($('<img>').addClass(dilosi + 'Asoi').attr({
			src: 'images/cpanel/asoiOn.png',
		}));
	}

	return domel;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

// Η μέθοδος "dodekadaDOM" καλείται στον client κατά τη στιγμή που ο τζογαδόρος
// αποκτά 12 φύλλα μαζί με τα φύλλα του τζόγου. Κατόπιν επαναδιατάσσει τα φύλλα
// και τα επανεμφανίζει στη σελίδα χρησιμοποιώντας διάφορα εφέ ώστε να γίνουν
// εμφανή τα φύλλα τού τζόγου. Θυμίζουμε ότι ο τζογαδόρος βρίσκεται στη θέση 1,
// δηλαδή στο νότο. Αφού εμφανιστούν τα φύλλα τού τζογαδόρου, τίθενται mouse event
// listeners προκειμένου να διευκολυνθεί ο τζογαδόρος στην αλλαγή των φύλλων.

Trapezi.prototype.dodekadaDOM = function() {
	var alagiCount = 0, i, j = 0, dur = 200;

	// Ο μετρητής "alagiCount" μετράει πόσα φύλλα έχει επιλέξει ο τζογαδόρος για
	// αλλαγή. Αν αυτός ο μετρήτής δείχνει ακριβώς δύο φύλλα θα εμφανίζουμε το
	// πάνελ επιλογής αγοράς, αλλιώς θα το αποκρύπτουμε.

	alagiCount = 0;

	// Προστίθενται τα φύλλα του τζόγου στα φύλλα του τζογαδόρου, επανεμφανίζονται
	// τα δώδεκα φύλλα και προστίθενται mouse event listeners προκειμένου να γίνει
	// αλλαγή.

	this.fila[this.tzogadoros].taxinomisi().xartosiaDOM(1,

	// Όταν ο τζογαδόρος τοποθετεί το ποντίκι πάνω σε κάποιο φύλλο, το φύλλο
	// μετακινείται ελαφρώς προς τα πάνω, εκτός κι αν το έχει ήδη «κλειδώσει»
	// για αλλαγή οπότε είναι ήδη ανεβασμένο.

	function(e) {
		var filo = $(this);

		e.stopPropagation();
		if ($(this).data('clicked')) return;

		$(this).finish().animate({
			bottom: '+=20px',
		}, 100, function() {
			filo.addClass('filoPano');
		});
	},

	// Παίρνοντας το ποντίκι έξω από την περιοχή τού φύλλου, το φύλλο επανέρχεται
	// στην κανονική του θέση, εκτός κι αν ο τζογαδόρος το έχει «κλειδώσει» για
	// αλλαγή.

	function(e) {
		var filo = $(this);

		e.stopPropagation();
		if ($(this).data('clicked')) return;

		if ($(this).data('kato')) {
			$(this).data('kato', false);
			return;
		}

		$(this).finish().animate({
			bottom: '-=20px',
		}, 50, function() {
			filo.removeClass('filoPano');
		});
	},

	// Κάνοντας κλικ πάνω σε κάποιο φύλλο, το «κλειδώνουμε» για αλλαγή, εκτός κι
	// αν είναι ήδη «κλειδωμένο» οπότε το απελευθερώνουμε.

	function(e) {
		var i, alagiPrev = alagiCount, panel = $('#PXpanel');

		Prefadoros.input.apiko(e);
		if ($(this).data('clicked')) {
			$(this).data('clicked', false).trigger('mouseleave').data('kato', true);
			alagiCount--;
		}
		else if ($(this).data('kato')) $(this).trigger('mouseenter').data('kato', false).trigger('click');
		else {
			$(this).data('clicked', true);
			alagiCount++;
		}

		// Αν τα φύλλα που έχουμε κλειδώσει για αλλαγή είναι ακριβώς δύο, τότε
		// θα πρέπει να εμφανίσουμε το πάνελ επιλογής αγορών.

		if ((alagiPrev == 2) && (alagiCount != 2)) {
			panel.data('emfanes', false);
			panel.find('.protasiAgora').css({display: 'none'});
			panel.find('.protasiAsoi').css({opacity: 0.3});
			$('#PXagora').remove();
			$('#PXminima').stop().fadeIn(dur);
			Prefadoros.tsoxa.fyi(Pexnidi.minima.alagi);
		}
		else if ((alagiPrev != 2) && (alagiCount == 2)) {
			panel.data('emfanes', true);
			panel.find('.protasiAsoi').css({opacity: 1});
			$('#PXminima').stop().fadeOut(dur, function() {
				panel.find('.protasiAgora').css({display: 'inline-block'});
			});
			Prefadoros.tsoxa.fyi(Pexnidi.minima.epilogi);
		}
	});

	// Δημιουργούμε εφέ προκειμένου να γίνουν εμφανή τα φύλλα τού τζόγου.

	for (i in this.tzogos.alif) {
		$('#FL' + i).stop().css({bottom: '180px'}).animate({bottom: '20px'}, 400, 'easeInQuad', function() {
			if (j++) Client.sound.play('ding.ogg', 6);
			$(this).delay(2000).animate({bottom: 0}, 900, 'easeOutBounce');
		});
	}

	return this;
}
